/********************************************************************************
*	模块名称 : BSP API 模块
*	该模块不引用cpu底层头文件，
*   应用程序通过此接口调用bsp封装可降低引用文件数，加快编译速度
********************************************************************************/
#ifndef _BSP_API_H_
#define _BSP_API_H_

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "math.h"
#include "taskmanger.h"
#include "swiic.h"

/*******************************************************************************
* init
*******************************************************************************/
void bsp_Init(void);
void bsp_Idle(void);
void bsp_clock_config(void);

/*******************************************************************************
* system msp stack, 仅用于用户堆栈和系统堆栈分离的OS，或者裸机程序
*******************************************************************************/
void stack_init(void);
uint16_t stack_used(void); // 千分数

/*******************************************************************************
* port
*******************************************************************************/
void bsp_qpi_port_init(void);
void bsp_spim_port_init(void);

/*******************************************************************************
* dwt
*******************************************************************************/
void bsp_delay_init(void);
void bsp_dwt_check(void);
void bsp_delay_us(uint32_t us);
void bsp_delay_ms(uint32_t ms);
uint32_t bsp_cpu_clks_get(void);
uint32_t bsp_clks_to_us(uint32_t clks);

/*******************************************************************************
* delay
*******************************************************************************/
void bsp_block_dly_init(void);
void bsp_block_dly_ms(uint32_t ms);
void bsp_block_dly_us(uint32_t us);

/*******************************************************************************
* cpu
*******************************************************************************/
#define  cpu_data_sync()               __DSB()
#define  cpu_instruct_sync()           __ISB()

void wfi_set(void);

#define intx_alloc()		
//关闭所有中断(但是不包括fault和NMI中断)
#define intx_disable		__disable_irq
//开启所有中断
#define intx_enable		__enable_irq

void nvic_irq_set(uint32_t IRQn, uint32_t priority, uint8_t newst);

/*******************************************************************************
* uart - com
*******************************************************************************/
void bsp_uart_init(void);

/*******************************************************************************
* iic
*******************************************************************************/
extern const swiic_cfg_type bsp_sw_iic;
extern const iic_obj_type sw_iic_obj;
#define	sw_iic		&bsp_sw_iic
void bsp_iic_send_only(char *dat, char len);

/*******************************************************************************
* pwm
*******************************************************************************/
void pwm_period_set(uint16_t period);
void pwm_duty_set(char ch, uint16_t duty);

/*******************************************************************************
* cap
*******************************************************************************/
void cap_res_handle(void);
uint16_t cap_period_get(void);
uint16_t cap_duty_get(void);
uint32_t cap_pulse_get(void);

/*******************************************************************************
* app tick info opt
*******************************************************************************/
uint32_t app_tick_init (uint32_t TickPriority);
void app_tick_resume(void);
void app_tick_suspend(void);
uint32_t app_tick_get(void);
uint32_t app_tick_us_get(void);
void app_tick_duty_set(uint8_t ch, uint16_t duty);
void app_timer_task_add(void (*task)(void));
void app_timer_task_del(void (*task)(void));

/*******************************************************************************
* adc
*******************************************************************************/
void bsp_adc_init(void);
void bsp_adc_val_handle(void);
void bsp_tp_adc_init(void);

/*******************************************************************************
* pwm
*******************************************************************************/
uint32_t bsp_pwm_timer_init(void);
void bsp_pwm_duty_set(char ch, uint16_t duty);

/*******************************************************************************
* @brief   ENABLE
*******************************************************************************/

/*******************************************************************************
* @brief   WDT
*******************************************************************************/
void bsp_wdt_init(void);
void bsp_wdt_feed(void);

/*******************************************************************************
* @brief   lcd
*******************************************************************************/
void lcd_hal_init(void);

/*******************************************************************************
* @brief   NOP
*******************************************************************************/
#if defined ( __ICCARM__ )
#define __nop() asm("nop")
#define _nop_() asm("nop")
#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050)
#define _nop_ __builtin_arm_nop
#elif defined ( __GNUC__ )
#define _nop_() asm("nop")
#else
#define _nop_() __nop()
#endif

#define NOP1()  _nop_()
#define NOP2()  NOP1();NOP1()
#define NOP3()  NOP2();NOP1()
#define NOP4()  NOP3();NOP1()
#define NOP5()  NOP4();NOP1()
#define NOP6()  NOP5();NOP1()
#define NOP7()  NOP6();NOP1()
#define NOP8()  NOP7();NOP1()
#define NOP9()  NOP8();NOP1()
#define NOP10() NOP9();NOP1()
#define NOP11() NOP10();NOP1()
#define NOP12() NOP11();NOP1()
#define NOP13() NOP12();NOP1()
#define NOP14() NOP13();NOP1()
#define NOP15() NOP14();NOP1()
#define NOP16() NOP15();NOP1()
#define NOP17() NOP16();NOP1()
#define NOP18() NOP17();NOP1()
#define NOP19() NOP18();NOP1()
#define NOP20() NOP19();NOP1()
#define NOP21() NOP20();NOP1()
#define NOP22() NOP21();NOP1()
#define NOP23() NOP22();NOP1()
#define NOP24() NOP23();NOP1()
#define NOP25() NOP24();NOP1()
#define NOP26() NOP25();NOP1()
#define NOP27() NOP26();NOP1()
#define NOP28() NOP27();NOP1()
#define NOP29() NOP28();NOP1()
#define NOP30() NOP29();NOP1()
#define NOP31() NOP30();NOP1()
#define NOP32() NOP31();NOP1()
#define NOP33() NOP32();NOP1()
#define NOP34() NOP33();NOP1()
#define NOP35() NOP34();NOP1()
#define NOP36() NOP35();NOP1()
#define NOP37() NOP36();NOP1()
#define NOP38() NOP37();NOP1()
#define NOP39() NOP38();NOP1()
#define NOP40() NOP39();NOP1()
#define NOP(N)  NOP##N()

#endif

